为什么ScaleIO和VSAN不要求三副本?
有朋友建议我多写点软件定义存储方面的东西,毕竟这是现在流行的趋势。之前我除了在VMware VSAN、Ceph方向写过几篇之外,研究其它分布式存储技术确实少一些,可能是由于搞硬件出身的缘故吧:)
双副本和三副本差在哪里?
这个问题估计很多朋友都知道答案,比如在下图流行的Ceph等分布式块存储、文件系统和对象存储/云盘中,三副本数据保护机制应该是应用最广的。
这个我在两年前的《IDF15:Ceph性能测试浅析及优化》中曾经列出过。Ceph的RADOS对象架构的写操作是先写到某个节点上的OSD主副本,然后再由该节点通过网络向另外两个节点的从副本写入。
在这种情况下,如果是用10GbE万兆网络,每节点配置2条专用的集群网络连接比较好,同时也兼顾冗余。如果这2个网口与业务网络混用,不太适合对性能要求较高的场合。
去年我还写过一篇《IDF16:解读Ceph百万IOPS测试及优化》,和许多公开的Ceph性能测试一样也是双副本配置。这样数字上确实好看,但对于Ceph生产环境来说三副本或者纠删码几乎是必须的。
相比之下,同为分布式存储的VMware VSAN却并不特别强调3副本,尽管它能支持1-4个副本。这里面涉及到一点技术设计上的不同——数据打散or不打散。
VSAN“不打散”所以双副本可用
如上图,VSAN的多副本也被称为(网络)RAID-1,如果用户想进一步通过条带化(stripe)提高性能,可以将硬盘(或数据层SSD)“先做RAID 0再做RAID 1”已达到类似RAID 10的效果。组成一对条带的成员盘可以位于相同或者不同的服务器节点,而我看到VMware对RAID 0(stirpe)不是太推荐,HDD混合存储VSAN的性能更多凭借SSD缓存。
以上图为例,一个vmdk磁盘卷文件分布于stripe-1a、1b、2a和2b所在的4块硬盘上,如果stripe-1a的硬盘故障,在修复完成之前只要保证stripe-2a正常访问即可。一个关键的要点是,单个vmdk没有打散到整个集群的机制,这点与Ceph、ScaleIO等多数SDS不同。
而Ceph等就不同了,根据CRASH对象分布(打散)机制,如果在双副本集群中坏一块盘,它上面数据对象的副本有可能分布在集群其它节点上的每一块盘,这时就容不得再出问题。为了保证较高的可靠性和可用性,需要三副本和容错能力不低于N+2的纠删码保护。
ServerSAN先行者XIV的规模限制
上面列出了IBM XIV的架构图,以今天的角度来看,它就是一套分布式ServerSAN。硬件上是6-15个节点,每节点12块大容量7200转近线硬盘,豪华一些的是节点间互连的InfiniBand交换机,以及UPS支撑的服务器内存来做缓存(每节点还支持1个SSD读缓存)。
XIV的存储空间按照1MB的粒度打散,并通过伪随机算法实现分布式镜像(双副本),它也需要面对和Ceph类似的问题。除了想办法提高Rebuild速度之外,我们看到XIV单集群的节点规模一直没有超过15个,保护域内的硬盘数量为180个。
很早我就听Vincent Hsu讲过XIV测试过4个机架,但最终他们还是没有引入3副本,按传统企业存储的思路来看三重镜像无论容量还是性能上的代价都太大。如果换用速度更快的硬盘或者SSD,又面临容量下降或者成本上升的问题。
ScaleIO曾经设计支持3副本?
在上图的ScaleIO集群中,标记“S”的节点代表提供存储服务的Server端,“C”代表Client客户端,同时部署Server和Client即现在时髦的超融合部署。
ScaleIO也是的一大特点是性能高,可以说是分布式存储/ServerSAN中的标杆。下文中我还会列出相关的参考资料。
这个截图中的文字从2013年的一篇blog引用,这至少说明ScaleIO在早期设计中支持/考虑过3副本。但后来估计是跟XIV类似的考虑,为了不在性能上妥协所以只支持2副本。当然,ScaleIO的软件栈为闪存充分优化过,全SSD配置的效果很好。
保护域和故障集:配合保障2副本可靠性
上图描述了ScaleIO集群中的几个概念:
1、 保护域(Protection Domain):可以理解为设定一个像XIV那样180块盘/15节点的子集群规模限制;
2、 存储池(Storage Pool):为保护域中的一个子集。指派每个节点上一部分磁盘/SSD加入,实现容量、性能上的隔离,并支持固定分层。
3、 故障集(Fault Set):主要用于机架隔离,预防单个机柜中的节点集体断电/断网。位于一个故障集中每份数据的副本都需要存放于别的故障集中(如下图)。
从这里可以看出,故障集1中的2个节点如果同时离线,ScaleIO集群仍能保持在线访问。
引用自《EMC SCALEIO DESIGN CONSIDERATIONS AND BEST PRACTICES》
在ScaleIO的最佳实践文档中,推荐了一种小型-中等规模的16节点系统。设计了单个保护域,服务器节点数量与XIV接近;每节点24盘位总共达到了384个硬盘(7200转1TB),但划分为A、B、C三个存储池,每个池不超过144个硬盘。
当一个驱动器出现故障时,会在96/144块盘的存储池内快速Rebuild数据,以这套配置的单盘容量压力比XIV要低。
整节点故障的概率比硬盘/SSD要低,这时需要重构的数据量增加,面对的情况与XIV单节点故障相仿。简单说就是对双副本可能带来的风险,已进行过充分的考虑和预防。
如果是更大规模的系统(ScaleIO最大支持1024节点),就需要划分多个保护域了。下面我们来看看ScaleIO的产品限制详情:
在2016年6月的这份白皮书中,ScaleIO最大支持6TB硬盘,每个SDS节点物理容量不超过64TB,设备(HDD/SSD)数量最多64个,这些可以限制Rebuild时的最大数据量。
ScaleIO单个保护域中的节点数量限制为128,我理解这在实际部署中可以结合其它因素一起考虑。每个存储池的最大驱动器设备数为300,数字上虽然超出XIV不少,但如果使用SSD或者小容量硬盘Rebuild的时间窗口压力也会缩短,所以并不代表风险会增加。我们要活学活用。
性能效率如何?
注:3-6节点为实测数值,6-128节点是推测的。后续我还会写点实测数据的分析。
选择放弃3副本支持,ScaleIO也收获到了极致的性能。NULL Device这个词我想许多朋友不陌生了,就是一个位于内存中的“空设备”,读取它不需要访问具体的硬盘/SSD就可以返回。从上面两条接近的虚线来看,读取PCIe Flash ScaleIO集群的性能,只比NULL Device降低了9%。128节点可达接近3千万IOPS,平均每节点贡献20万IOPS的线性扩展。
这里我打个小广告,Dell和EMC联合推出了ScaleIO Ready Node,也就是优化设计的存储服务器硬件。选择它可以获得较为合理的配置,并不用担心购买存储软件DIY的兼容性问题,这与VSAN Ready Node的情况相似。
集中式存储的“三副本”支持
既然有的分布式存储可以用双副本(RAID 1镜像),那为什么集中式存储阵列还要支持三重镜像呢?
上表引用自《Understanding RAID with Dell SC Series Storage》,RAID 10-DM(Dual Mirror,即三重镜像)随机写性能强于RAID 6,并且提供可靠的双冗余和最好的Rebuild性能。这些都与分布式存储中的三副本相符,而双控阵列没有网络开销。
Dell SC(Compellent)采用了原生宽条带化RAID,或称RAID 2.0类技术的代表产品之一。HDD/SSD空间均打散为512KB-4MB页面(数据块),并在它们之间组建RAID。
Dell SC RAID技术的一个特色是,支持的种类比较丰富。其中RAID 10和RAID 5只在单盘容量、驱动器数量不超过一定范围内允许选择,这是为了避免在打散的存储池中出现双盘故障。
相比之下,NetApp E系列/PowerVault MD3、富士通等阵列后来加入支持的宽条带化RAID,只有类RAID 6一种保护级别。上图引用自NetApp的资料,DDP就相当于Dell SC的RAID 6,其实测随机写性能接近RAID 6,这就是RAID 10-DM存在的意义。
反过来说,RAID 10-DM的不足之处主要就是容量利用率。对此Dell SC的另一个特色实现了优势互补——在同一种类型驱动器的存储池中支持跨RAID级别分层。
如上图,新写入阵列的数据可以按照RAID 10或者10-DM以获得较好的性能,而后按需或者周期性转换为RAID 5/6保护形态,可显著提高容量利用率。被Replay快照“冻结”的奇偶校验RAID子分层在这里只响应读请求,因此不会影响写性能。
本文主要是围绕ScaleIO来写,最后讲了点题外话,也是有感于分布式存储实现自动分层机制比集中式阵列明显要困难。说到底还是跨节点网络开销和分布式元数据管理的麻烦,因此我们看到VSAN的SSD缓存是每个节点“各自为战”的。
延伸阅读 《存储极客:为什么说VSAN与Dell SC渐行渐近?》
注:本文只代表作者个人观点,与任何组织机构无关,如有错误和不足之处欢迎在留言中批评指正。进一步交流技术,可以加我的QQ/微信:490834312。如果您想在这个公众号上分享自己的技术干货,也欢迎联系我:)
尊重知识,转载时请保留全文,并包括本行及如下二维码。感谢您的阅读和支持!《企业存储技术》微信公众号:huangliang_storage
长按二维码可直接识别关注
历史文章汇总(传送门):http://chuansong.me/account/huangliang_storage